// @ts-ignore
import Cookies from 'js-cookie'

//这里是一些cookies的方法

const TokenKey = 'XM-Token'

export function getToken() {
  return Cookies.get(TokenKey)
}

//保存并设置时间
export function setCookieTime(key:any,val:any,day:any) {
  return Cookies.set(key, val,{ expires: day })
}

export function getCookie(Key:string) {
  return Cookies.get(Key)
}
export function setCookies(key:any,val:any) {
  return Cookies.set(key, val)
}

export function removeCookies(key:string) {
  return Cookies.remove(key)
}

/********************** 增强 Storage 方法 ​**********************/
type StorageType = 'local' | 'session'

/**
 * 通用存储方法（支持过期时间和加密）
 * @param key 键名
 * @param value 值（对象自动序列化）
 * @param options 配置项：类型、过期时间（天）、加密
 */
export function setStorage(
  key: string,
  value: any,
  options?: {
    type?: StorageType
    expires?: number
    encrypt?: boolean
  }
) {
  const storage = options?.type === 'session' ? sessionStorage : localStorage
  const data = {
    value: options?.encrypt ? btoa(JSON.stringify(value)) : JSON.stringify(value),
    expires: options?.expires ? Date.now() + options.expires * 864e5 : null // 网页8的时间转换方式
  }
  storage.setItem(key, JSON.stringify(data))
}

/**
 * 获取存储值（自动处理过期和加密）
 * @param key 键名
 * @param type 存储类型
 */
export function getStorage<T = any>(
  key: string,
  type?: StorageType,
  options?: { encrypt?: boolean } // 新增 options 参数
): T | null {
  const storage = type === 'session' ? sessionStorage : localStorage;
  const rawData = storage.getItem(key);
  if (!rawData) return null;

  try {
    const { value, expires } = JSON.parse(rawData);
    if (expires && Date.now() > expires) {
      removeStorage(key, type);
      return null;
    }
    // 使用传入的 options.encrypt
    return value ? JSON.parse(options?.encrypt ? atob(value) : value) : null;
  } catch (e) {
    console.error(`Storage解析失败: ${key}`, e);
    return null;
  }
}

/**
 * 删除存储项
 * @param key 键名
 * @param type 存储类型
 */
export function removeStorage(key: string, type?: StorageType) {
  const storage = type === 'session' ? sessionStorage : localStorage
  storage.removeItem(key)
}

/********************** 整合方法（统一接口） ​**********************/
interface StorageUtils {
  get: (
    key: string, 
    type?: 'cookie' | StorageType,
    options?: { encrypt?: boolean } // 新增 options 参数
  ) => string | null;
  set: (
    key: string,
    value: any,
    options?: {
      type?: 'cookie' | StorageType
      expires?: number
      encrypt?: boolean
    }
  ) => void
  remove: (key: string, type?: 'cookie' | StorageType) => void
}

export const storage: StorageUtils = {
  get: (key, type = 'cookie', options) => 
    type === 'cookie' 
      ? getCookie(key) 
      : getStorage(key, type as StorageType, options), // 传递 options

  set: (key, value, options) => {
    if (options?.type === 'cookie') {
      options?.expires 
        ? setCookieTime(key, value, options.expires)
        : setCookies(key, value)
    } else {
      // setStorage(key, value, options)
      setStorage(key, value)
    }
  },

  remove: (key, type = 'cookie') => {
    type === 'cookie' 
      ? removeCookies(key)
      : removeStorage(key, type as StorageType)
  }
}



// 使用实例
// 存储用户 Token（Cookie，7天过期）
// storage.set('X-Auth-Token', 'abc123', { 
//   type: 'cookie', 
//   expires: 7 
// })

// // 存储用户配置（localStorage，永久）
// storage.set('user_prefs', { theme: 'dark' }, { 
//   type: 'local',
//   encrypt: true 
// })

// // 获取数据
// const token = storage.get('X-Auth-Token', 'cookie')
// const prefs = storage.get('user_prefs', 'local')

// // 删除 session 数据
// storage.remove('temp_data', 'session')
